package com.edu.exam.enums.grading;

import com.edu.exam.enums.core.BaseEnum;

/**
 * 验证规则类型枚举
 *
 * 管理成绩验证规则的类型，包括分数范围、必填项、格式验证等规则类型
 *
 * @author System
 * @version 1.0.0
 */
public enum ValidationRuleType implements BaseEnum {

    /**
     * 分数范围
     */
    SCORE_RANGE("SCORE_RANGE", "分数范围"),

    /**
     * 必填项
     */
    REQUIRED("REQUIRED", "必填项"),

    /**
     * 格式验证
     */
    FORMAT("FORMAT", "格式验证"),

    /**
     * 业务规则
     */
    BUSINESS_RULE("BUSINESS_RULE", "业务规则"),

    /**
     * 数据一致性
     */
    DATA_CONSISTENCY("DATA_CONSISTENCY", "数据一致性"),

    /**
     * 重复性检查
     */
    DUPLICATION_CHECK("DUPLICATION_CHECK", "重复性检查");

    private final String code;
    private final String description;

    ValidationRuleType(String code, String description) {
        this.code = code;
        this.description = description;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 获取枚举的JSON值（使用code）
     *
     * @return 枚举代码
     */
    public String getJsonValue() {
        return code;
    }

    /**
     * 从代码创建枚举实例
     *
     * @param code 枚举代码
     * @return 对应的枚举实例，如果代码无效则返回SCORE_RANGE
     */
    public static ValidationRuleType fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            return SCORE_RANGE;
        }

        for (ValidationRuleType type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return SCORE_RANGE;
    }

    /**
     * 检查是否为数据质量相关规则
     *
     * @return true如果是数据质量相关规则
     */
    public boolean isDataQualityRule() {
        return this == DATA_CONSISTENCY || this == DUPLICATION_CHECK;
    }

    /**
     * 获取规则类型的执行优先级
     * 数值越大优先级越高
     *
     * @return 优先级数值
     */
    public int getExecutionPriority() {
        switch (this) {
            case REQUIRED:
                return 10;  // 必填项检查优先级最高
            case SCORE_RANGE:
                return 9;   // 分数范围
            case FORMAT:
                return 8;   // 格式验证
            case DATA_CONSISTENCY:
                return 7;   // 数据一致性
            case DUPLICATION_CHECK:
                return 6;   // 重复性检查
            case BUSINESS_RULE:
                return 5;   // 业务规则优先级最低
            default:
                return 0;
        }
    }
}